<body>
    <script>
        //1. yield 后面的结果 为调用 .next() 方法的返回值     
        //2. 第二个next()的参数对应  第一个（yield '某某某'）的返回值 
        function quest(params = {num:1}){
            return new Promise((resolve ,reject)=>{
                  setTimeout(()=>{
                    resolve(params)
                  },2000)
            })
        }

        function *creater(){
            // 问为什么data1可以接收到 quest()函数调用的结果？
            // 答 ： 因为在第一次 next 调用的时候结果已经拿到了，并且作为参数传递给了第二个next('结果')作为 （yield '某某某'）的返回值
            const data1 = yield quest()
            console.log(data1)
            const data2 = yield quest({...data1,name:1})
            console.log(data2)
            const data3 = yield quest({...data2,age:1})
            console.log(data3)
        }
        // 模拟await实现
       function run(creater){
        const iterator = creater()
        function walk(iterator,param){
            const { done,value } = iterator.next(param)
           if(!done){
            value.then(res =>{
                walk(iterator,res)
            })
           }
        }
        walk(iterator)
       }
       run(creater)
    </script>
</body>
</html>